#DataBase #NoSQL #Neo4j
Neo4j
Graph
- 节点(事物)和边(关系)的集合,其中边为节点对的连接
- 适用于任何相关数据
- 可在节点和关系上附加属性(键值对)与关系
- 关系连接两个节点,节点和关系都可以保存为任意数量的键值对
What is Neo4j ?
- Neo4j 是一个高度可扩展的原生图数据库,不仅可以利用数据,还可以利用数据之间的关系。
- 图形(即网络)是处理数据的最高效、最直观的方式,它模仿了人类头脑中思想的相互联系。Neo4j 从底层开始构建,旨在利用图形的力量来实时洞察底线。
- 它采用直观的适应性数据建模技术。
- 使用图形查询语言 Cypher
- Neo4j是一个数据库
- 用它来可靠地存储信息并在以后查找它
- Neo4j的数据模型是图,尤其是属性图
Quick Start Only For MacOS
Installation
- 安装 Neo4J (此处采用
homebrew
包管理器进行安装)
shell
brew install neo4j
Start
- MacOS 后台启动 Neo4j
shell
brew services start neo4j
- 命令行启动 Neo4j
shell
cypher-shell
- 输入用户名密码
用户名 | 密码 |
---|---|
neo4j | neo4j |
Stop
- 退出命令行
shell
:exit
- 关闭 MacOS后台服务
shell
brew services stop neo4j
What is Cypher ?
Cypher 是一种声明式图形查询语言,可以对图形存储进行高效的查询和更新。
- Cypher 借鉴了 SQL 的结构,使用各种子句建立查询。
- Cypher是Neo4j的图形查询语言(图的SQL!)
- Cypher 是一种声明式查询语言:它描述的是你感兴趣的内容,而不是如何获取这些内容。
- Cypher 具有很强的可读性和表现力
Basic Structure
- Node 节点
- Relationship 关系
- Property 属性
- Label 标签
Node
- Cypher 使用一对括号(通常包含一个文本字符串),如 (), (foo) 来表示一个节点
- 最简单的形式是(),表示一个匿名的、未表征的节点。
- 引用其他地方的节点,添加一个变量:(matrix)
- Movie 标签(前缀为冒号)说明了节点的类型或作用。
- 属性可用于存储信息和/或限制模式。例如,我们可以 MATCH 和 RETURN 标题为 "The Matrix "的节点。
Label
- 标签允许我们对节点进行分组
- Cypher 使用标签来更好地决定如何优化查询
cypher
MATCH (node:Label) RETURN node
cypher
MATCH(node1:Label) -[:REL_TYPE]-> (node2:Label) RETURN node1, node2
Relationship
- 关系是一个节点指向另一个节点的箭头,就像 -> 或 <- 。但我们可以根据需要在一对方括号中添加有关它们的细节。
cypher
MATCH(node1:Label) -[:REL_TYPE]-> (node2:Label) RETURN node1, node2
cypher
MATCH(node1:Label) -[REL:TYPE]-> (node2:Label) RETURN rel.property
Query
Create Node
cypher
CREATE(node: Label {key:value, ...})
cypher
CREATE (n:Person {name: 'Allen', age: 20})
Modify Property
cypher
MATCH (n:Label {key:value})
SET n.key = value
Add Relationship
cypher
MATCH (n1:Label {key:value}), (n2:Label {key:value})
CREATE (n1)-[r:RELATIONSHIP]->(n2)
Delete Relationship
cypher
MATCH (n:Label {key:value})
REMOVE n.key
Delete Node
- DELETE Node
cypher
MATCH (n:Label {key:value})
DELETE n
- DELETE Node and Relationship
cypher
MATCH (node {Property:Value})
DETACH DELETE node
cypher
MATCH (a:Label {Property: value})
OPTIONAL MATCH (a)-[r]-()
DELETE a, r
MATCH会返回空 OPTIONAL MATCH 即使没有匹配到也会返回 NULL
Sort, Limit, Skip
ORDER BY
- 在 Cypher 中,使用 ORDER BY 命令很容易对结果进行排序。
- 比方说,我们想显示数据库中年龄最大的人。我们可以使用下面的查询:
cypher
MATCH (person:Person)
RETURN person.name, person.born
ORDER BY person.born
- 也可以使用 DESC 关键字来指定降序排序:
cypher
MATCH (person:Person)
RETURN person.name, person.born
ORDER BY person.born DESC
- 升序
cypher
MATCH (person:Person)
RETURN person.name, person.born
ORDER BY person.born ASC
LIMIT and SKIP
- Cypher 支持对记录集进行简便的分页。
- 它使用 LIMIT 和 SKIP 语句来减少返回记录的数量,并允许对结果进行分页。
- LIMIT: 限制返回的记录数
- SKIP: 跳过指定数量的记录
cypher
MATCH (person:Person)
RETURN person.name, person.born
ORDER BY person.born DESC
SKIP 10 LIMIT 5
SKIP 10 LIMIT 5
- 从第 10 条记录开始,返回 5 条记录
DISTINCT
- 通常,我们要求查询只返回不同的结果
cypher
MATCH (person:Person)
RETURN DISTINCT person.born
路径模式
选中的节点与边组成的字符串
起点和终点都是节点
查找图中与Gene Hackman合作过的演员
cypher
MATCH (gene:Person)-[:ACTED_IN]->()<-[:ACTED_IN]-(other:Person)
WHERE gene.name="Gene Hackman"
RETURN distinct other
- 查找所有电影相关演职人员的三种写法
cypher
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie)<-[:DIRECTED]-(director:Person)
RETURN actor.name, movie.title, director.name;
cypher
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie),
(movie)<-[:DIRECTED]-(director:Person)
RETURN actor.name, movie.title, director.name;
cypher
MATCH (actor:Person)-[:ACTED_IN]->(movie:Movie),(director:Person)-[:DIRECTED]->(movie)
RETURN actor.name, movie.title, director.name;
变量路径模式
跨越任何深度的关系是: (a)-[*]->(b)
特定深度关系的表示方法是:(a)-[*深度]->(b),以查找所有深度步长的路径。
1到4层深度的关系是这样表示的: (a)-[*1..4]->(b)
距离 3 层的 KNOWS 类型关系:(a)-[:KNOWS*3]->(b)
2 层 KNOWS 或 LIKES 类型的关系:(a)-[:KNOWS|:LIKES*2...]->(b)
cypher
MATCH p =(actor { name: 'Tom Hanks' })-[:ACTED_IN*2]-(co_actor)
RETURN relationships(p)
最短路径
- 最短路径是两个节点之间的最短路径。
cypher
MATCH
(tom:Person { name: 'Tom Hanks' }),
(kevin:Person { name: 'Kevin Bacon' }),
p = shortestPath((tom)-[*..15]-(kevin))
RETURN p
Index 索引
Neo4j 不使用索引来加速 JOIN 操作
有助于通过值、前缀或范围查找起点
创建特定于标签的索引,因为索引绑定到具体的标签-属性组合上
示例:根据电影标题有效搜索
cypher
CREATE INDEX ON :Movie(title)
- 要删除索引,请使用以下 Cypher 命令
cypher
DROP INDEX ON :Movie(title)
创建特定标签的索引
- 在标有 "人 "的节点上创建索引,按属性名称建立索引:
cypher
CREATE INDEX ON :Person(name)
汇总
- COUNT(x)
- MIN(x)
- MAX(x)
- AVG(x)
- SUM(x)
- COLLECT(x)
cypher
MATCH (person:Person)-[:ACTED_IN]->(movie:Movie)
RETURN person.name, collect(movie.title)
LOAD CSV
- LOAD CSV 语句可将本地或远程文件解析为表示映射(带标题)或列表的一系列行。
- 使用任何 Cypher 操作来创建节点或关系,或与现有图结构合并
- 由于 CSV 文件通常表示节点或关系列表,因此需要执行多次操作,分别创建节点和关系。
- 示例,查询使用 movies.csv 中的数据作为属性创建电影节点
cypher
LOAD CSV WITH HEADERS
FROM "" AS line
CREATE (:Movie {id: line.id, title: line.title, released: toINT(line.year)})